/*********************************************************************************************************
**
**                                   GJB 标准测试集
**
**                               Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: S0102605.c
**
** 文件创建日期: 2021 年 1 月 12 日
**
** 描        述: 通过构造非法指令异常, 验证系统异常处理功能
*********************************************************************************************************/
#ifdef SYLIXOS
#define __SYLIXOS_KERNEL
#endif
#include <pthread.h>
#include <stdio.h>

// #include "gjb.h"

static pthread_attr_t  thread_attr1;
static pthread_t       thread_id1;

static void gjb_illeagal_code(void )
{
    typedef void (*funcTest)(void);
    int temp[10] = {0};
    funcTest  test;
    test = temp;
    pthread_delay(1000);
    test();
}

#define gjb_os_illeagal_code            gjb_illeagal_code

int pthread_delay(int ticks);

void *Fun1_security_1 (void *arg)
{
    printf("Task1 is running-1\n");

    /*
     *  构造非法指令异常, 不同的平台该函数的实现不同
     */
    gjb_os_illeagal_code();

    printf("Task1 is running-2\n");

    return NULL;
}

void pagefails (void)
{
    char  *p;
    int    i;

    // 这里只分配虚拟内存
    p = malloc(1024 * 1024);
    if (p) {
        // 这里真正用得时候会通过缺页异常分配真正得物理内存
        memset(p, 'a', 1024 * 1024);

        for (i = 0; i < 1024 * 1024; ++i) {
            if (*(p + i) != 'a') {
                printf("pagefails test failure.");
            }
        }

        free(p);
    }
}

/*
 *  非法指令异常测试入口函数
 */
int S0102605 (void)
{
    int     status     = -100;
    int     nDelaytime = 2000;
    int     i          = 0;
    char    a = 255;
    char    b = 255;
    char    c;

     // 缺页异常测试
    pagefails();

    // 运算符溢出测试, c 发生了溢出系统不应该出现异常
    c = a + b;
    printf("%d\n", c);

    /*
     *  初始化线程thread_attr1
     */
    pthread_attr_init(&thread_attr1);

    // thread_attr1.stackaddr                 = NULL;
    // thread_attr1.stacksize                 = PTHREAD_STACK_MIN * 2;
    // thread_attr1.inheritsched              = PTHREAD_EXPLICIT_SCHED;
    // thread_attr1.schedpolicy               = SCHED_FIFO;
    // thread_attr1.schedparam.sched_priority = 100;
    // thread_attr1.name                      = "Task1";

    status = pthread_create(&thread_id1, &thread_attr1, Fun1_security_1, NULL);
    if (status == 0) {
        printf( "Task1 create succesful\n");
    } else {
        printf( "Task1 create Failed\n");
        return  (-1);
    }

    /*
     * 延时2000 TICK
     */
    pthread_delay(nDelaytime);

    for (i = 0; i < 10; i++) {
        printf("MainFun is running\n");
    }

    return  (0);
}
/*********************************************************************************************************
 * 函数名称： GJB_ENTRY()
 * 功能描述： 用户程序入口
 * 输入参数： 无
 * 输出参数： 无
 * 返 回 值： 无
 * 其它说明： 无
*********************************************************************************************************/
int main(int argc, char **argv)
{
    int  result;

    result = S0102605();
    if (result != 0) {
        return (-1);
    }

    return (0);
}


typedef unsigned long long u64;
typedef	unsigned int 	u32;
#define SYSTEM_TICKS_USEC        1000
#define EMINITED 305
u64 g_pthread_delay_tick = 0;
int is_set_sys_rate = 0;
u32 g_sys_uleep_tick = 0;
int pthread_delay(int ticks)
{
    g_pthread_delay_tick = ticks;
    sched_yield();
    if(is_set_sys_rate)
    {
        return usleep(g_sys_uleep_tick * ticks);
    }
    else
    {
        return usleep(SYSTEM_TICKS_USEC * ticks);
    }
}
